package com.lhy.mymall.controller;

import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
import com.github.pagehelper.PageInfo;
import com.lhy.mymall.common.ApiRestResponse;
import com.lhy.mymall.common.Constant;
import com.lhy.mymall.exception.ExceptionEnum;
import com.lhy.mymall.exception.MallException;
import com.lhy.mymall.pojo.Product;
import com.lhy.mymall.request.AddProductReq;
import com.lhy.mymall.request.UpdateProductReq;
import com.lhy.mymall.service.ProductService;
import net.bytebuddy.implementation.InvokeDynamic;
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.UUID;

/**
 * @author: 卢辉宇
 * @date: 2022/12/16 20:47
 * @description: 后台商品管理controller
 */
@RestController
public class ProductAdminController {

    @Resource
    ProductService productService;

    @PostMapping("/admin/product/test")
    public ApiRestResponse test(String name){
        Product product = productService.selectByName(name);
        return ApiRestResponse.success(product);
    }

    @PostMapping("/admin/product/add")
    public ApiRestResponse addProduct(@Valid @RequestBody AddProductReq addProductReq) throws MallException {
        //service层添加商品的业务逻辑代码。。。
        productService.addProduct(addProductReq);

        return ApiRestResponse.success();
    }

    /**
     * 图片上传接口
     * @param httpServletRequest 请求的地址等信息
     * @param file 上传的文件
     * @return
     */
    @PostMapping("admin/upload/file")
    public ApiRestResponse upload(HttpServletRequest httpServletRequest, MultipartFile file) throws MallException {

        //获取文件的原始名字
        String fileName = file.getOriginalFilename();
        //得到文件的后缀
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成文件的UUID
        UUID uuid = UUID.randomUUID();
        //用uuid和后缀得到我们的文件名
        String newFileName = uuid.toString() + suffixName;

        //创建文件夹,在常量类中定义地址。。。
        File fileDir = new File(Constant.FILE_UPLOAD_DIR);
        //生成目标文件
        File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);

        //判断是否存在文件夹
        if(!fileDir.exists()){
            //不存在，新建
            if (!fileDir.mkdir()){
                //新建失败，抛出异常
                throw new MallException(ExceptionEnum.MKDIR_FAILED);
            }
        }

        //把传进来的file先存入刚才创建的那个目标文件中
        try {
            file.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //想要返回ApiRestResponse.success(result)，result带有http://ip和端口号的文件名，这里只是得到简单的文件名...
        String result= null;
        try {
            result = getHost(new URI(httpServletRequest.getRequestURL()+""))+"/img/"+newFileName;
        } catch (URISyntaxException e) {
            return ApiRestResponse.error(ExceptionEnum.UPLOAD_FAILED);
        }
        return ApiRestResponse.success(result);
    }

    /**
     * 把请求的http://ip:端口号 拿到
     * @param uri
     * @return http://ip:端口号
     */
    private URI getHost(URI uri){
        URI effectiveURI;
        try {
            //得到一个http://ip:端口号
            effectiveURI= new URI(uri.getScheme(),uri.getUserInfo(),uri.getHost(),uri.getPort(),null,null,null);
        } catch (URISyntaxException e) {
            effectiveURI=null;
        }
        System.out.println(effectiveURI);
        return effectiveURI;
    }

    /**
     * 更新商品方法
     * @param updateProductReq
     * @return
     */
    @PostMapping("/admin/product/update")
    public ApiRestResponse updateProduct(@Valid @RequestBody UpdateProductReq updateProductReq) throws MallException {
        //service层的更新逻辑...
        productService.updateProduct(updateProductReq);

        return ApiRestResponse.success();
    }

    @PostMapping("/admin/product/delete")
    public ApiRestResponse deleteProduct(Integer id) throws MallException {
        //service层的更新逻辑...
        productService.deleteProduct(id);

        return ApiRestResponse.success();
    }

    /**
     * 批量商品上下架
     * @param ids 需要上下架的商品id数组
     * @param status 需要上架还是下架的状态
     * @return
     */
    @PostMapping("/admin/product/batchUpdateShellStatus")
    public ApiRestResponse batchUpdateShellStatus(Integer[] ids,Integer status){
        //service层的业务逻辑代码
        productService.batchUpdateShellStatus(ids,status);

        return ApiRestResponse.success();
    }

    /**
     * 后台商品列表（分页）
     * @param pageNum
     * @param pageSize
     * @return
     */
    @PostMapping("/admin/product/list")
    public ApiRestResponse listForAdmin(Integer pageNum,Integer pageSize){

        //调用service层的分页逻辑。。。
        PageInfo pageInfo = productService.listForAdmin(pageNum, pageSize);

        return ApiRestResponse.success(pageInfo);
    }

    /**
     * excel表格导入商品
     * @param multipartFile 商品的excel表格
     * @return
     */
    @PostMapping("/admin/upload/product")
    public ApiRestResponse uploadProduct(MultipartFile multipartFile) throws MallException, IOException {
        //得到原始的文件名
        String filename = multipartFile.getOriginalFilename();
        //获取文件后缀
        String suffixName = filename.substring(filename.lastIndexOf("."));
        //的到uuid作为文件名
        UUID uuid = UUID.randomUUID();
        String newFileName = uuid.toString() + suffixName;

        //创建目标文件对象
        File destDir = new File(Constant.FILE_UPLOAD_DIR);
        File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
        if(!destDir.exists()){
            if (!destDir.mkdir()){
                //创建目录失败
                return ApiRestResponse.error(ExceptionEnum.MKDIR_FAILED);
            }
        }
        try {
            //把上传的文件转运到目标文件
            multipartFile.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //service层通过文件添加到数据库。。。
        productService.addProductByExcel(destFile);

        return ApiRestResponse.success();
    }


}
